#include <stdio.h>
#include "single_linked_list.cpp"
#include "list_stack.cpp"

// 带头结点的单链表 从尾到头输出
// 不带头结点递归
void ReversePrint(LinkedList &L)
{
   if (L == NULL)
      return;
   ReversePrint(L->next);
   printf("%d", L->data);
}

// 带头结点递归
void ReversePrint2(LinkedList &L)
{
   ReversePrint(L->next);
}

// 非递归带头结点 利用栈的特性
void ReversePrint3(LinkedList &L)
{
   LinkStack S;
   InitStack(S);
   LNode *ptr = L->next;
   // 压栈
   while (ptr != NULL)
   {
      Push(S, ptr->data);
      ptr = ptr->next;
   }
   // 出栈输出
   while (!StackEmpty(S))
   {
      int e;
      Pop(S, e);
      printf("%d", e);
   }
}

int main()
{
   LinkedList L;
   InitList(L);
   // 插入s
   ListAppend(L, 2);
   ListAppend(L, 3);
   ListAppend(L, 3);
   ListAppend(L, 7);
   ListAppend(L, 3);
   ListAppend(L, 6);
   PrintList(L);

   ReversePrint(L->next);
   printf("\n");
   ReversePrint2(L);
   printf("\n");
   ReversePrint3(L);
   return 0;
}